package Average;


import jade.core.AID;
import jade.core.Agent;
import jade.core.behaviours.*;
import jade.lang.acl.ACLMessage;
/**
 *  Agentul acesta cere date la Agentul Server si asteapta sa le primeasca pe toate.
 * Cand le-a primit pe toate, le trimite inapoi la clasa de interfata pentru jess (semnaland ca a terminat) 
 * */
public class AverageAgent extends Agent {
	/** variabile de stocare a datelor primite in mai multe mesaje */
	public float[] values;
	public String[] dates;
	/** referinta la agentul curent */
	AverageAgent agent=this;
	/** parametrii pentru request */
	String d1,d2;
	int id;
	/** numarul de valori primite */
	int max=-1;
	/** variabila de comunicatie cu clasa java (intrfata pentru jess) */
	CondVar sig=null;
	
	/**
	 *  Actiune ciclica pentru a primi toate mesajele de la server. 
	 *  Prima etapa: se trimite cerere pentru date din intervalul si tipul primit ca argument
	 *  Se asteapta raspuns: acesta trebuie sa contina numarul de date ce vor fi trimise
	 *  Se asteapta pentru toate mesajele cu datele cerute si se trimite un mesaj de confirmare pentru fiecare
	 *  */
	public CyclicBehaviour behav=new CyclicBehaviour(this) {
		/* numarul de date primite progresiv */
		int n=0,counter=0;
		public void action() {
			System.out.println(counter);
			/* prima etapa este de trimitere a cererii */
			if(counter == 0)
			{			
					/* creeare mesaj cu serverul ca receiver si parametrii ca si continut */		
				System.out.println("vreau sa trimit");
				try{
				AID r = new AID();				
				r.setName("ServerAgent@"+/*TinaPC:1099/JADE"*/agent.getHap());
				System.out.println("am setat server name: "+r.getName());
				String message=id+" "+d1+" "+d2;						
				ACLMessage msg = new ACLMessage(ACLMessage.REQUEST);
				System.out.println("msg.setSender(getAID());");
                msg.setSender(getAID());
                msg.addReplyTo(getAID());
                System.out.println("msg.addReceiver(r);");
                msg.addReceiver(r);
                System.out.println("msg.setContent(message);");
                msg.setContent(message);
                System.out.println("send(msg);");
				send(msg);
				System.out.println("am trimis cererea");
				}catch(Exception e){
					e.printStackTrace();
				}
				//block(1000);*/	
				/*  se trece la pasul urmator */
				counter++;
			}
			else
			{
				/* suntem in etapa de asteptare a raspunsurilor */
				ACLMessage msg = receive();
				if (msg != null)
				{
				/* daca este primul raspuns acesta trebuie procesat altfel */
				if(counter==1)
				{/* primul mesaj contine numarul de date ce vor fi trimise */
					String response=msg.getContent();
					int x=-1;
					try{
						x=Integer.parseInt(response.trim());
					}catch(Exception e){
						
					}
					/* initializez variabilele pentru date */
					if(x!=-1)
					{
						max=x;
						values=new float[max];
						dates=new String[max];
						System.out.println("primesc "+max+" valori");
					}
				}
				else
				{
					/* e mesaj cu valori */
					String response[]=msg.getContent().trim().split(" ");
					if(response.length==2)
					{
						values[n]=Float.parseFloat(response[0]);
						dates[n]=response[1];
						System.out.println("primit "+values[n]);
						n++;						
					}					
				}
				/* trimit raspuns de confirmare */
				try{			
					String message="ok";						
					ACLMessage msg2 = new ACLMessage(ACLMessage.CONFIRM);
	                msg2.setSender(getAID());
	                msg2.addReplyTo(getAID());
	                msg2.addReceiver(msg.getSender());
	                msg2.setContent(message);
					send(msg2);
					}catch(Exception e){
						e.printStackTrace();
					}
					/* crestem pasul */
				counter++;
				/* verifica daca am terminat de primit toate mesajele */
				if(n>=max)
				{
					System.out.println("gata de primit");
					/* semnalez ca datele sutn gata si susopend agentul */
					sig.signal(values);
					
					agent.doDelete();
				}
				}
				
			
			}
			
		}
	};
	/** 
	 * functia de setare a agentului cu parametrii primiti
	 * */
	protected void setup() {
		
		setEnabledO2ACommunication(true,1);
		/* obtin argumentele trimise */
	      Object[] args = getArguments();
	      if(args.length == 2) {
	    	  sig=(CondVar)args[0];
	    	  Object[] o=(Object[])args[1];	    	  
	    	  id = Integer.parseInt(o[0].toString());
	    	  d1=o[1].toString();
	    	  d2=o[2].toString();
	      }
		/* adaug comportamentul descris */
		addBehaviour(behav);		
	}
}